package cn.o.app.ui;

import android.content.Context;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;
import android.widget.TextView;
import cn.o.app.util.DisplayUtil;

/**
 * 字体自适应的TextView。 <br>
 * 自动减小TextSize以保证适应TextView宽度，不出现换行。
 * 
 * @author shaka
 *
 */
public class OFontFitTextView extends TextView {
	protected Paint mPaint;
	protected float MIN_TEXTSIZE = 12;
	protected float mMinTextSize;

	public OFontFitTextView(Context context) {
		super(context);
		init();
	}

	public OFontFitTextView(Context context, AttributeSet attrs) {
		super(context, attrs);
		init();
	}

	public OFontFitTextView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		init();
	}

	protected void init() {
		mPaint = new Paint();
		mPaint.set(getPaint());
		mMinTextSize = MIN_TEXTSIZE;
	}

	protected void refitText(String text, int textViewWidth) {
		if (textViewWidth > 0) {
			int availableWidth = textViewWidth - getPaddingLeft()
					- getPaddingRight();

			/* 最小TextSize时文本长度超过TextView宽度，直接设为最小TextSize，并将TextSize设为不可见 */
			mPaint.setTextSize(DisplayUtil.sp2px(getContext(), mMinTextSize));
			if (mPaint.measureText(text) > availableWidth) {
				setTextSize(mMinTextSize);
				setVisibility(View.INVISIBLE);
				return;
			}

			int trySize = DisplayUtil.px2sp(getContext(), getTextSize());
			mPaint.setTextSize(getTextSize());
			while (mPaint.measureText(text) > availableWidth
					&& trySize > mMinTextSize) {
				trySize -= 1;
				mPaint.setTextSize(DisplayUtil.sp2px(getContext(), trySize));
			}
			setTextSize(trySize);
		}
	}

	@Override
	protected void onSizeChanged(int w, int h, int oldw, int oldh) {
		if (w != oldw) {
			refitText(getText().toString(), w);
		}
	}

	@Override
	protected void onTextChanged(CharSequence text, int start,
			int lengthBefore, int lengthAfter) {
		refitText(text.toString(), getWidth());
	}

	public float getmMinTextSize() {
		return mMinTextSize;
	}

	public void setmMinTextSize(float mMinTextSize) {
		this.mMinTextSize = mMinTextSize;
	}
}
